//1 typeof
//2 in 
//3 instanceof
//4 ==，=== ,!== ,!=
// 类型守卫 缩小类型范围

/***
 * typeof  类型判断，语法 typeof x  返回对应数据类型
 * 
 typeof检测变量并不完全准确，例如typeof null结果为object,这其实设计者的一个bug,但后来一 直没有
  被改过来，于是就此传下来了，但把null当成object的理由说成是未来可能会拥有一个对象空间， 这个理由
  很牵强[我们检测的是对象变量此刻的类型]，null 本来即是数据类型，也是值。所以typeof null直接显示
  null最合适了。.

 * 优点：
 *      语法简单，使用简单
 * 缺点：
 *      只能对进本数据应用类型进行数据监测   "string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function"  
 * */
const func = () => { }
const s = Symbol()
const Bi = BigInt(Number.MAX_SAFE_INTEGER)
console.log(typeof 1)
console.log(typeof '')
console.log(typeof [])
console.log(typeof {})
console.log(typeof false)
console.log(typeof undefined)
console.log(typeof null)
console.log(typeof func)
console.log(typeof s)
console.log(typeof Bi)
/**
 * in 用于验证对象某一个属性是否存在 在该对象上 语法 'x' in {x:12} 该表达式返回 boolean 类型数据
 * 
 */
const user = {
  cat: '吃饭',
  eye: '眼',
  run: '走'
}

console.log('run' in user);
console.log('nose' in user);

/**
 * instanceof 用于监测是否是实例的
 *  
 * 
 */




class userInfo {
  constructor(public _name: string, public _sex: number) { }
}

let newUserInfo = new userInfo('自夏', 12)

console.log(newUserInfo instanceof userInfo)


console.log([123, 123] instanceof Array)
console.log({} instanceof Object)
console.log(new Set([1, 2, 3, 4]) instanceof Set)
console.log(new Map() instanceof Map)

/**
 * 
 *  ==，=== ,!== ,!=
 * == 是判断值是否相等
 * === 是判断值和类型是否相等
 * !=  比较时，若类型不同，会偿试转换类型 返回同类型值比较结果
 * !== 只有相同类型才会比较 不同类型不比较，且无结果 同类型才比较
 */

// var a: string = '1', b: string = '1'
// console.log(a == b)

var a: string = '1', b: number = 1
// @ts-ignore
console.log(a == b) // true
console.log(null == undefined) // true
// @ts-ignore
console.log(a === b) // false

console.log(null === undefined) // false
// @ts-ignore
console.log(1 != 1); // false 1 等于 1

console.log(a !== a); // false a 等于 a
// @ts-ignore
console.log(a !== b); // true a 等于 a